package safe;

import java.util.concurrent.TimeUnit;

/**
 * @author lzm
 * @date 2025/2/20 20:02
 * @description 多线程版的累加器 - 在代码中手动加锁解决线程不靠谱问题
 */
public class AdderV4 {

    int i = 0;

    // 定义一个锁对象
    private final Object lock = new Object();

    /**
     * 多线程版的累加器
     */
    public void add() throws InterruptedException {
        // 为每个线程创建计算任务
        Runnable task = () -> {
            // 将变量i加1，重复这个操作10000次
            for (int j = 0; j < 10000; j++) {
                // 对+1的计算任务加锁
                synchronized (lock) {
                    i++;
                }
            }
        };
        // 一共有5个线程，每个线程都对变量i进行一万次+1的操作
        for (int j = 0; j < 5; j++) {
            new Thread(task, "线程-" + j).start();
        }
        TimeUnit.SECONDS.sleep(1);
    }


    public static void main(String[] args) throws InterruptedException {
        AdderV4 adder = new AdderV4();
        adder.add();
        System.out.println("计算结果是：" + adder.i);
    }

}
